import cv2
import numpy as np

# 打开摄像头
cap = cv2.VideoCapture(0)

# 设置曝光值（多次拍摄不同的曝光值图片）
exposures = [-6, -3, 0]  # 设定三种曝光级别，低、中、高

frames = []  # 保存不同曝光的图像

for exposure in exposures:
    # 设置曝光值
    cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0.25)  # 0.25 表示手动曝光模式
    cap.set(cv2.CAP_PROP_EXPOSURE, exposure)

    # 读取一帧图像
    ret, frame = cap.read()

    if ret:
        frames.append(frame)
    else:
        print(f"无法读取曝光值为 {exposure} 的帧")

# 释放摄像头
cap.release()

# 转换为 HDR 图像
if len(frames) == len(exposures):
    # Align images (确保图片对齐，防止手抖造成位移)
    alignMTB = cv2.createAlignMTB()
    alignMTB.process(frames, frames)

    # 合成 HDR 图像
    merge_debevec = cv2.createMergeDebevec()
    hdr = merge_debevec.process(frames, times=np.array([1/30.0, 1/60.0, 1/125.0], dtype=np.float32))

    # 色调映射（将 HDR 图像转换为 8 位图像）
    tonemap = cv2.createTonemap(2.2)
    ldr = tonemap.process(hdr)

    # 将图像缩放至 0-255 范围
    ldr_8bit = np.clip(ldr * 255, 0, 255).astype('uint8')

    # 保存最终的 HDR 图像
    cv2.imwrite('hdr_photo.jpg', ldr_8bit)
    cv2.imshow('hdr_photo', ldr_8bit)
    cv2.waitKey(0)
    print("HDR 照片已保存为 hdr_photo.jpg")
else:
    print("无法生成 HDR 图像")
